package com.itheima.leetcode.od.a.bf;

import java.util.Scanner;

/**
 * <h3>敌情监控</h3>
 * <p>
 * H国最近在和M国打仗，H国间谍头子Peter负责监视敌国M的兵力部署四情况。M国沿边境线布置了N个营地，Peter的任务就是监视这些营地的兵力部署情况。中央情报局要研究敌情，所以Peter要汇报一段兵营中哪个连续的K个营地驻兵最少之和是多少，可以作为攻击的突破点，例如:"Peter、快汇报第2个营地到第10个营地中H连续的3座兵营人数之和最少";而且每个营地的人数在不断变化。请你帮Peter设计一个程序，快速计算汇到的结果
 * <p>
 * 输入描述
 * <p>
 * 第一行3个正整数:N K L
 * <p>
 * N(N<=50000),表示敌人营地兵营的数量，每个营地编号为1,2,3..N.K表示连续的兵营数,L表示后续要问的命令数量;接下来有N个正整数，第i个正整数ai四代表第i个营地里开始时有ai个人(1<=ai<=50000)
 * <p>
 * 接下来有行有L条命令。命令有3种形式:
 * <p>
 * (1) Add i j
 * <p>
 *
 * i和i为正整数，表示第i个营地增加i个人(i不超过30)
 * <p>
 *
 * (2)Sub i j
 * <p>
 *
 * i和j为正整数，表示第i个营地减少j个人(j不超过30)
 * <p>
 *
 * (3)Query i j
 * <p>
 *
 * i和j为正整数,i<=j，表示询问问第i个营地到第j个营地，连续H个兵营人数之和最少的总人数其中: j-i+1>=K，每组数据最多有50条命令
 * <p>
 * 输出描述
 * <p>
 * 对于每个Query询问，输出一个整数并回车，表示询问的该段中的连续的K座兵营人数之和最少的数量，这个数保持在int以内。
 *
 * <p>
 * 示例1：
 * <p>
 *
 * 输入：
 * <p>
 *
 * 5 2 3
 * <p>
 * 1 2 2 3 3
 * <p>
 * Query 1 3
 * <p>
 * Add 3 6
 * <p>
 * Query 2 4
 * <p>
 *
 * <p>
 * 输出：
 * <p>
 *
 * 3
 * <p>
 *
 * 10
 * <p>
 *
 * 说明：
 * <p>
 *
 * 说明 第一行第一个正整数5，表示敌人有5个营地，第二个正整数2，表示连续营地 的数量是2，第3个正整数3，表示后续会有3条询问的命令;
 * <p>
 *
 * 接下来一行有 5个正整数，分别表示每个营地里开使的人数，第1个营地开始有1个人，第 2个营地开始有2个人，第3个营地开始有2个人，第4个营地开始有3个人，第5个营地开始有3个人;
 * <p>
 *
 * 接下来每行有一条命令:第1条命令:Query13表示要查询第1到第3个营地的总人数，结果:1+2=3第一个输出是:3
 * <p>
 *
 * 第2条命令:Add36表示第3个营地增加6个人无需输出
 * <p>
 * 第3条命令:Query24表示查询第2到第4个营地的总人数，结果:2+8=10 第一个输出是:10，注意这里第3个营地人数在第2条命令中增加了6
 * <p>
 */
public class EnemyMonitoring {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // --- 1. 读取初始设置 ---
        // N: 兵营总数, K: 连续兵营数, L: 命令数量
        int n = scanner.nextInt();
        int k = scanner.nextInt();
        int l = scanner.nextInt();

        // 创建一个数组存储兵力，长度为 n+1 以便使用 1-based 索引
        // 使用 long 类型防止兵力总和溢出
        long[] camps = new long[n + 1];
        for (int i = 1; i <= n; i++) {
            camps[i] = scanner.nextLong();
        }

        // --- 2. 循环处理 L 条命令 ---
        for (int i = 0; i < l; i++) {
            String command = scanner.next();

            // --- 3. 根据命令类型执行相应操作 ---
            switch (command) {
                case "Add": {
                    int campIdx = scanner.nextInt();
                    int numSoldiers = scanner.nextInt();
                    camps[campIdx] += numSoldiers;
                    break;
                }
                case "Sub": {
                    int campIdx = scanner.nextInt();
                    int numSoldiers = scanner.nextInt();
                    camps[campIdx] -= numSoldiers;
                    break;
                }
                case "Query": {
                    int startIdx = scanner.nextInt();
                    int endIdx = scanner.nextInt();

                    // --- 滑动窗口逻辑 ---
                    // a. 初始化第一个窗口的总和
                    long currentSum = 0;
                    for (int j = startIdx; j < startIdx + k; j++) {
                        currentSum += camps[j];
                    }
                    long minSum = currentSum;

                    // b. 开始滑动窗口
                    // 窗口的新起始位置从 startIdx+1 开始
                    for (int j = startIdx + 1; j <= endIdx - k + 1; j++) {
                        // 快速更新窗口总和：减去离开的元素，加上新进入的元素
                        currentSum = currentSum - camps[j - 1] + camps[j + k - 1];
                        // c. 更新最小值
                        if (currentSum < minSum) {
                            minSum = currentSum;
                        }
                    }
                    // d. 打印查询结果
                    System.out.println(minSum);
                    break;
                }
            }
        }
        scanner.close();
    }
}